/*
 * FrmOpstartscherm.java
 *
 * Created on 29 februari 2008, 14:15
 */
package client.gui;

import client.communication.*;
import client.gui.CreateGameroom;
import client.gui.BoggleClient;
import client.gui.ScrabbleClient;
import client.gui.Settings;
import client.gui.smilies.CSAXParserSmileys;
import client.gui.smilies.ISmileyOntvanger;
import client.gui.smilies.SmileyVerwerker;
import client.gui.smilies.smileyPopup;
import java.awt.Color;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.logging.Level;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.text.BadLocationException;
import javax.swing.text.StyledDocument;
import org.apache.log4j.Logger;
import data.Gameroom;
import data.Gameroom.Gametype;
import data.Gebruiker;
import data.Score;
import java.net.URI;
import javax.swing.WindowConstants;

/**
 * De klasse Chatroom is een klasse die voor de gebruiker gemaakt is.
 * Ze maakt een GUI aan voor de gebruiker en bevat een object dat voor
 * de connectie met de server zorgt. Hierdoor kan de gebruiker beginnen
 * chatten met andere gebruikers in de chat.
 * @author
 */
public class Chatroom extends javax.swing.JFrame implements ISmileyOntvanger {

    private Logger logger = Logger.getLogger(Chatroom.class);
    private DefaultListModel model; //om de JList op te vullen
    private Gebruiker gebruiker,  selectedGebruiker;
    private boolean spelen = false;
    private ArrayList<Gebruiker> spelers = null;
    private ScrabbleClient scrabbleGame = null;
    private BoggleClient bogglegame;
    private Registreer rfrm;
    private smileyPopup popup;
    JFrame editFrame = new JFrame("Edit");
    private Profiel profielForm;

    /**
     * Class constructor die de GUI aanmaakt (Default)
     */
    public Chatroom() {
        initComponents();
    }

    /**
     * Class constructor voor het aanmaken van een een chat voor de gebruiker
     * Roept eerst de default constructor op om de GUI aan te maken.
     * Maakt ook een model aan voor de listbox.
     * @param Mlistener ClientCommunication object dat de communicatie tussen
     *                  client en server verzorgt
     * @param g Gebruiker waarvoor de chat gemaakt wordt.
     */
    public Chatroom(Gebruiker g) {
        this();
        try {
            this.setGebruiker(g);
            CSAXParserSmileys parser = new CSAXParserSmileys();
            //parser.parse(getClass().getResource("/smileys.xml").getFile());
            // logger.info(getClass().getResource("/smileys.xml").getFile());
            String s;
            try {
                s = getClass().getResource("").getFile().split("ScrabbleProject.jar")[0];
            } catch (Exception ex) {
                //wanneer het prog niet al jar opgestart wordt}
                s = getClass().getResource("").getFile();
            }
            URI uri = new URI(s + "smileys.xml");
            s = uri.getPath();
            parser.parse(s);
            //model voor de listbox
            model = new DefaultListModel();
            lstOnlineSpelers.setModel(model);
            //ervoor zorgen dat er maar 1 item geselecteerd kan worden
            lstOnlineSpelers.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

            popup = new smileyPopup(this);

            this.setTitle("Welkom " + g.getNickname());

            //Gamerooms ophalen
            ClientCommunication.getInstance().haalGameroomsOp();
        } catch (URISyntaxException ex) {
           logger.error(ex.getMessage());
        }
    }

    public void ToonGebruikersForm(Gebruiker g, Score sc) {
        profielForm = new Profiel(g, sc);
        getProfielForm().setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        getProfielForm().pack();
        getProfielForm().setLocationRelativeTo(this);
        getProfielForm().toon();
    }

    public void ToonSettings() {
        Settings settingForm = new Settings();
        settingForm.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        settingForm.pack();
        settingForm.setLocationRelativeTo(this);
        settingForm.toon();
    }

    /**
     * Functie die instaat voor het klikbaar, niet klikbaar maken
     * van buttons tijdens het spel. Hierdoor kan de gebruiker niet
     * op een verkeerde knop drukken en zal er geen onverwachte error opduiken.
     * Deze functie bevat ook de functionaliteit van de privé berichten.
     */
    public void enableDisableControls() {
        //Wanneer het spel aan het opstarten is mogen de gebruikers niet op de knoppen kunnen klikken
        if (isSpelen() == true) {
            btnDetail.setEnabled(false);
            btnVerzenden.setEnabled(false);
        } else {
            btnVerzenden.setEnabled(true);
            if (lstOnlineSpelers.getSelectedIndex() == -1) {
                chkPrive.setEnabled(false);
                btnDetail.setEnabled(false);
            } else {
                //Wanneer prive aangevinkt is mag btnVerzenden slechts enabled staan
                //wanneer er een speler in de lijst geselecteerd is
                chkPrive.setEnabled(true);
                btnDetail.setEnabled(true);
            }
        }
    }

    /**
     * Functie die het model opvult met online spelers.
     */
    public void opvullenOnlineSpelers() {
        model.removeAllElements();
        for (Gebruiker g : spelers) {
            //toevoegen aan jList
            int pos = lstOnlineSpelers.getModel().getSize();
            model.add(pos, g.getNickname());
        }
    }

    /**
     * Functie die de doorgestuurde berichten in het chatvenster zet.
     * Berichten van de server zullen in het grijs weergegeven worden,
     * berichten van de leden in het zwart.
     * @param bericht Een string die de tekst bevat die wordt doorgestuurd
     */
    public void plaatsBericht(String bericht) {
        //berichten die door de server gestuurd zijn beginnen met >>
        //deze verschijnen dan in het grijs
        if (bericht.startsWith(">>")) {
            txtaChat.append(bericht + "\n", Color.GRAY);
        } else {
            txtaChat.append(bericht + "\n");
        }
        txtaChat.setCaretPosition(txtaChat.getDocument().getLength() - 1);
        try {
            StyledDocument doc = txtaChat.getStyledDocument();
            String text = doc.getText(0, doc.getLength());
            String path = "/client/gui/smilies/images/";
            SmileyVerwerker.parseSmileys(path, doc, text, bericht.length());

            txtaChat.setStyledDocument(doc);
        } catch (BadLocationException exc) {
            logger.error("Smilies file: Bad Location");
            logger.error(exc.getMessage());
        }
    }

    public void setBoggleGame(BoggleClient bc) {
        this.bogglegame = bc;
    }

    public BoggleClient getBogglegame() {
        return bogglegame;
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        pnlTabs = new javax.swing.JTabbedPane();
        pnlChatroom = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        lstOnlineSpelers = new javax.swing.JList();
        btnDetail = new javax.swing.JButton();
        txtBericht = new javax.swing.JTextField();
        btnVerzenden = new javax.swing.JButton();
        chkPrive = new javax.swing.JCheckBox();
        btnSmilie = new javax.swing.JToggleButton();
        helpLinkLabel1 = new client.gui.controls.HelpLinkLabel();
        jScrollPane2 = new javax.swing.JScrollPane();
        txtaChat = new client.gui.controls.ColoredTextpane();
        pnlStartedGames = new javax.swing.JPanel();
        jPanel1 = new javax.swing.JPanel();
        btnMaakGameroom = new javax.swing.JButton();
        btnJoin = new javax.swing.JButton();
        btnSettings = new javax.swing.JButton();
        helpLinkLabel2 = new client.gui.controls.HelpLinkLabel();
        btnTopscores = new javax.swing.JButton();
        gameRoomPanel1 = new client.gui.controls.GameRoomPanel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setResizable(false);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        pnlTabs.setPreferredSize(new java.awt.Dimension(587, 465));

        jLabel1.setText("Online spelers:"); // NOI18N

        lstOnlineSpelers.setModel(new javax.swing.AbstractListModel() {
            String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
            public int getSize() { return strings.length; }
            public Object getElementAt(int i) { return strings[i]; }
        });
        lstOnlineSpelers.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                lstOnlineSpelersValueChanged(evt);
            }
        });
        jScrollPane1.setViewportView(lstOnlineSpelers);

        btnDetail.setText("Detail speler"); // NOI18N
        btnDetail.setEnabled(false);
        btnDetail.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnDetailActionPerformed(evt);
            }
        });

        txtBericht.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txtBerichtKeyPressed(evt);
            }
        });

        btnVerzenden.setText("Verzenden"); // NOI18N
        btnVerzenden.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                verzendBericht(evt);
            }
        });

        chkPrive.setText("Privé"); // NOI18N
        chkPrive.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
        chkPrive.setEnabled(false);
        chkPrive.setMargin(new java.awt.Insets(0, 0, 0, 0));

        btnSmilie.setIcon(new javax.swing.ImageIcon(getClass().getResource("/client/gui/smilies/images/1_grin.gif"))); // NOI18N
        btnSmilie.setMargin(new java.awt.Insets(2, 2, 2, 2));
        btnSmilie.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSmilieActionPerformed(evt);
            }
        });

        jScrollPane2.setViewportView(txtaChat);

        org.jdesktop.layout.GroupLayout pnlChatroomLayout = new org.jdesktop.layout.GroupLayout(pnlChatroom);
        pnlChatroom.setLayout(pnlChatroomLayout);
        pnlChatroomLayout.setHorizontalGroup(
            pnlChatroomLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(pnlChatroomLayout.createSequentialGroup()
                .addContainerGap()
                .add(pnlChatroomLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(txtBericht, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 457, Short.MAX_VALUE)
                    .add(btnDetail, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 109, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(jScrollPane2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 457, Short.MAX_VALUE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 10, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(pnlChatroomLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, pnlChatroomLayout.createSequentialGroup()
                        .add(chkPrive)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 73, Short.MAX_VALUE)
                        .add(helpLinkLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, pnlChatroomLayout.createSequentialGroup()
                        .add(btnVerzenden, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 102, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .add(btnSmilie, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 27, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, jLabel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 133, Short.MAX_VALUE))
                .add(12, 12, 12))
        );
        pnlChatroomLayout.setVerticalGroup(
            pnlChatroomLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(pnlChatroomLayout.createSequentialGroup()
                .addContainerGap()
                .add(pnlChatroomLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(pnlChatroomLayout.createSequentialGroup()
                        .add(jLabel1)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 306, Short.MAX_VALUE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                        .add(pnlChatroomLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                            .add(helpLinkLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(chkPrive)))
                    .add(jScrollPane2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 352, Short.MAX_VALUE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                .add(pnlChatroomLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(pnlChatroomLayout.createSequentialGroup()
                        .add(pnlChatroomLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                            .add(txtBericht, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 23, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(btnVerzenden))
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(btnDetail))
                    .add(btnSmilie))
                .addContainerGap())
        );

        pnlTabs.addTab("Chatroom", pnlChatroom);

        pnlStartedGames.setLayout(new java.awt.BorderLayout());

        btnMaakGameroom.setText("Nieuw..."); // NOI18N
        btnMaakGameroom.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnMaakGameroomActionPerformed(evt);
            }
        });

        btnJoin.setText("Join"); // NOI18N
        btnJoin.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnJoinActionPerformed(evt);
            }
        });

        btnSettings.setText("Settings...");
        btnSettings.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSettingsActionPerformed(evt);
            }
        });

        btnTopscores.setText("Topscores"); // NOI18N
        btnTopscores.setMaximumSize(new java.awt.Dimension(83, 23));
        btnTopscores.setMinimumSize(new java.awt.Dimension(83, 23));
        btnTopscores.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnTopscoresActionPerformed(evt);
            }
        });

        org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel1Layout.createSequentialGroup()
                        .add(helpLinkLabel2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap())
                    .add(jPanel1Layout.createSequentialGroup()
                        .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false)
                            .add(org.jdesktop.layout.GroupLayout.LEADING, btnTopscores, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .add(org.jdesktop.layout.GroupLayout.LEADING, btnSettings, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .add(org.jdesktop.layout.GroupLayout.LEADING, btnJoin, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .add(org.jdesktop.layout.GroupLayout.LEADING, btnMaakGameroom, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addContainerGap(17, Short.MAX_VALUE))))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel1Layout.createSequentialGroup()
                .add(23, 23, 23)
                .add(btnMaakGameroom)
                .add(18, 18, 18)
                .add(btnJoin)
                .add(18, 18, 18)
                .add(btnSettings)
                .add(56, 56, 56)
                .add(btnTopscores, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 205, Short.MAX_VALUE)
                .add(helpLinkLabel2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pnlStartedGames.add(jPanel1, java.awt.BorderLayout.LINE_END);

        gameRoomPanel1.setPreferredSize(new java.awt.Dimension(400, 400));
        pnlStartedGames.add(gameRoomPanel1, java.awt.BorderLayout.CENTER);

        pnlTabs.addTab("Games", pnlStartedGames);

        getContentPane().add(pnlTabs, java.awt.BorderLayout.PAGE_START);

        pack();
    }// </editor-fold>//GEN-END:initComponents
   /**
    * Functie die zal kijken of de enterknop ingedrukt werd. Indien hij
    * werd ingedrukt zal het bericht verzonden worden naar de client.
    * @param evt KeyEvent waarop beslist wordt welke actie te ondernemen.
    */
   private void txtBerichtKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtBerichtKeyPressed
// TODO add your handling code here:
       //wanneer er op enter geklikt wordt, bericht verzenden
       if (evt.getKeyCode() == 10) {
           verzendBericht();
       }

   }//GEN-LAST:event_txtBerichtKeyPressed

   /**
    * Functie die zorgt voor het ophalen van de highscores
    * @param evt ActionEvent die zal aangeven of er op de knop "Highscores"
    * geklikt werd.
    */
   /**
    * Functie die de details van een bepaalde speler zal opvragen aan de server
    * @param evt ActionEvent die waarneemt of er op de knop "Detail Speler"
    * geklikt werd om de details van een speler weer te geven.
    */
   private void btnDetailActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDetailActionPerformed
// TODO add your handling code here:
       detailsTonen();
   }//GEN-LAST:event_btnDetailActionPerformed


   /**
    * Functie die de details van een speler weergeeft. Deze geeft de naam
    * en de email van de geselecteerde speler terug.
    */
   public void detailsTonen() {

       //new CreateGameroom(gebruiker).setVisible(true);
       String gebruikerNaam = (String) lstOnlineSpelers.getSelectedValue();
       logger.info("aanvraag voor de gegevens van" + gebruikerNaam);
       if (!gebruikerNaam.isEmpty()) {
           //Gebruiker g = ClientCommunication.getInstance()

           //hier moeten de gegevens opgevraagd worden voor in te vullen in ofwel
           //editeerbaar scherm ofwel in prfielscherm
           if (gebruikerNaam.equals(gebruiker.getNickname())) {
               logger.info("Het is de eigen gebruikersnaam dus naar edit gaan");
               // Gebruiker g = ClientCommunication.getInstance().getSpelerByLogin(gebruikerNaam, gebruiker.getPaswoord());

               editFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
               rfrm = new Registreer(gebruiker, this);
               if (editFrame.isEnabled()) {
                   editFrame.setResizable(false);
                   //registreerpaneel aan frame toevoegen
                   editFrame.add(rfrm);

                   //venster weergeven
                   editFrame.pack();
                   editFrame.setVisible(true);
               } else {
                   editFrame.dispose();
               }
           } else {
               logger.info("Het is NIET de eigen gebruikersnaam doorgaan met aanvraag naar server");
               try {
                   ClientCommunication.getInstance().getSpelerByNickname(gebruikerNaam);
               } catch (IOException ex) {
                   java.util.logging.Logger.getLogger(Chatroom.class.getName()).log(Level.SEVERE, null, ex);
               }

           }

       }
   /*
   JOptionPane.showMessageDialog(this, "Login: " + getSelectedGebruiker().getNickname() + "\n" +
   "email: " + getSelectedGebruiker().getEmail() + "\n");
    */
   }

   /**
    * Functie die zal waarnemen als er een speler online of offline gaat.
    * In dit geval word de functie enableDisableControls opgeroepen zodat
    * elke speler de correcte knoppen kan gebruiken.
    * @param evt ListSelectionEvent
    */
   private void lstOnlineSpelersValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_lstOnlineSpelersValueChanged
// TODO add your handling code here:
       enableDisableControls();
   }//GEN-LAST:event_lstOnlineSpelersValueChanged

   /**
    * Functie die waarneemt of er een bericht moet verzonden worden.
    * Indien er op de knop verzenden geklikt werd zal deze functie de
    * functie verzendBericht() oproepen.
    * @param evt ActionEvent die waarneemt of er op de knop verzenden
    *            geklikt werd
    */
   private void verzendBericht(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_verzendBericht
// TODO add your handling code here:
       verzendBericht();
   }//GEN-LAST:event_verzendBericht

   /**
    * Functie die de speler van de server afsluit. Veranderd status van speler
    * naar offline en setGaming op fals, waarna de server geupdate wordt.
    * @param evt WindowEvent die het sluiten van het venster waarneemt.
    */
   private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
// TODO add your handling code here:
       getGebruiker().setOnline(false);
       getGebruiker().setGaming(false);
       try {
           ClientCommunication.getInstance().updateSpeler(getGebruiker());
           ClientCommunication.getInstance().spelerOffline(getGebruiker().getNickname());
           ClientCommunication.getInstance().closeConnection();

           //illegalThreadStateExcepion wanneer de server eerst afgesloten is en dit de laatste client is die moet afgesloten worden
           //Ik heb fout niet kunnen oplossen en voorkomen waardoor deze error
           //kan fout ook niet opvangen, denk dat dit komt doordat ze optreed in system.exit()
           System.exit(0);
       } catch (IOException ex) {
           logger.error(ex.getMessage());
       } catch (IllegalThreadStateException ex) {
           logger.error(ex.getMessage());
       } catch (Exception ex) {
           logger.error(ex.getMessage());
       }

   }//GEN-LAST:event_exitForm

   private void btnMaakGameroomActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnMaakGameroomActionPerformed

       //new CreateGameroom(gebruiker).setVisible(true);
       CreateGameroom cgr = new CreateGameroom(gebruiker, this);
       cgr.pack();
       cgr.setLocationRelativeTo(this);
       cgr.toon();
}//GEN-LAST:event_btnMaakGameroomActionPerformed

   private void btnJoinActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnJoinActionPerformed
       // TODO add your handling code here:
       Gameroom selected = gameRoomPanel1.getGeselecteerdeRoom();
       if (selected == null) {
           JOptionPane.showMessageDialog(this, "Gelieve een gameroom te selecteren!");
       } else {
           if (selected.getPaswoord().equals("null")) {
               //Scrabble scherm opstarten
               startGame(selected);
           } else {
               String pw = JOptionPane.showInputDialog(this, "Geef het paswoord in voor deze gameroom:", "Beveiligde gameroom!", JOptionPane.QUESTION_MESSAGE);
               if (selected.getPaswoord().equals(pw)) {
                   //Scrabble scherm opstarten
                   startGame(selected);
               } else {
                   JOptionPane.showMessageDialog(this, "Fout paswoord!");
               }
           }
       }
}//GEN-LAST:event_btnJoinActionPerformed

   private void btnSmilieActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSmilieActionPerformed
       // TODO add your handling code here:
       popup.show(btnSmilie,-(int)popup.getPreferredSize().getWidth() + btnSmilie.getWidth(),-(int)popup.getPreferredSize().getHeight() + btnSmilie.getHeight());
   }//GEN-LAST:event_btnSmilieActionPerformed

   private void btnSettingsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSettingsActionPerformed
       ToonSettings();
}//GEN-LAST:event_btnSettingsActionPerformed

   private void btnTopscoresActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnTopscoresActionPerformed
       // TODO add your handling code here:
       Topscores topscores;
       if(ClientCommunication.getInstance().getTopscoreGui()==null){
           topscores = new Topscores(gebruiker.getNickname());
       }else{
           topscores = ClientCommunication.getInstance().getTopscoreGui();
       }
        topscores.pack();
       //positie
       topscores.setLocationRelativeTo(null);
       topscores.setVisible(true);
       topscores.toFront();
       topscores.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
 
}//GEN-LAST:event_btnTopscoresActionPerformed

   public void startGame(Gameroom selected) {
       if (selected.getType().equals(Gametype.SCRABBLE)) {
           ScrabbleClient sc = new ScrabbleClient(this.gebruiker, this, selected);
           this.setScrabbleGame(sc);
           ClientCommunication.getInstance().joinGameroom(this.gebruiker.getNickname(), selected.getGamenaam());
           //sc.vraagBlokjesAan(ClientCommunication.getInstance().getPlankje().getMaxAantalBlokjes(), gebruiker.getNickname(), selected.getGamenaam());
           this.setVisible(false);
           sc.toon();
       } else if (selected.getType().equals(Gametype.BOGGLE)) {
           BoggleClient bc = new BoggleClient(this.gebruiker, this, selected,false);
           this.setBoggleGame(bc);
           ClientCommunication.getInstance().joinGameroom(this.gebruiker.getNickname(), selected.getGamenaam());
           this.setVisible(false);
           bc.pack();
           bc.toon();
       }

   }

   /**
    * Functie die de berichten verzend. Wordt uitgevoerd als er op de knop
    * "Verzend bericht" werd geklikt. Het bericht word uit txtBericht gehaald
    * en doorgestuurd naar de chat of als een privé bericht doorgestuurd naar
    * de geselecteerde speler.
    */
   private void verzendBericht() {
       if (!txtBericht.getText().equals("")) {
           if (chkPrive.isSelected()) {
               String login = (String) lstOnlineSpelers.getSelectedValue();
               if (getGebruiker().getNickname().equals(login)) {
                   JOptionPane.showMessageDialog(this, "Je kan geen prive-bericht naar jezelf sturen");
               } else {
                   ClientCommunication.getInstance().zendPriveChatBericht(getGebruiker().getNickname(), txtBericht.getText(), login);
                   plaatsBericht("[Prive to " + login + "]: " + getGebruiker().getNickname() + ">> " + txtBericht.getText());
                   txtBericht.setText("");
               }

           } else {
               ClientCommunication.getInstance().zendChatBericht(getGebruiker().getNickname(), txtBericht.getText());
               txtBericht.setText("");
           }

       }
   }

   public void gameroomToevoegen(Gameroom gr) {
       gameRoomPanel1.addGameroom(gr);
   }

   public void vulGameroomsOp(ArrayList<Gameroom> gamerooms) {
       Hashtable<String, Gameroom> rooms = new Hashtable<String, Gameroom>();
       for (Gameroom gr : gamerooms) {
           //Als de oprichter van het spel veranderd is doordat de oorspronkelijke heeft
           //afgesloten, dit instellen in scrabbleGame
           if (scrabbleGame != null && gr.getGamenaam().equals(scrabbleGame.getGameroom().getGamenaam())) {
               scrabbleGame.veranderOprichterSpel(gr.getNicknameOprichter());
           }
           if (bogglegame != null && gr.getGamenaam().equals(bogglegame.getGameroom().getGamenaam())) {
               bogglegame.veranderOprichterSpel(gr.getNicknameOprichter());
           }
           if (!gr.isSpelGestart() && gr.getMaxAantalSpelers() > gr.getAantalSpelers()) {
               rooms.put(gr.getGamenaam(), gr);
           }
       }

       gameRoomPanel1.setGamerooms(rooms);
       gameRoomPanel1.updateGameroomLijst();
   }


   /**
    * Functie die de lijst van spelers zal terug geven
    * @return Lijst met online spelers.
    */
   public ArrayList<Gebruiker> getSpelers() {
       return spelers;
   }

   /**
    * Functie om de lijst met spelers op te vullen
    * @param spelers Lijst van spelers
    */
   public void setSpelers(ArrayList<Gebruiker> spelers) {
       this.spelers = spelers;
   }

   /**
    * Functie die de status van een speler kan weergeven. In geval een
    * speler een spel aan het spelen is zal deze funtie true terug geven
    * in het andere geval false.
    * @return boolean die aangeeft of de speler een spel bezig is.
    */
   public boolean isSpelen() {
       return spelen;
   }

   /**
    * Functie die de status van een speler kan veranderen van false naar
    * true. Hiermee wordt aangegeven dat de speler niet meer de focus heeft
    * op de chat maar op zijn spelbord en zal hij geen mogelijkheden meer
    * hebben om buttons te gebruiken uit de chat.
    * @param spelen Boolean die de status op true of false set.
    */
   public void setSpelen(boolean spelen) {
       this.spelen = spelen;
   }

   /**
    * Functie die een gebruiker zal teruggeven
    * @return De gebruiker wordt terug gegeven
    */
   public Gebruiker getGebruiker() {
       return gebruiker;
   }

   /**
    * Functie die de gebruiker van de chatroom instelt.
    * @param gebruiker De gebruiker
    */
   public void setGebruiker(Gebruiker gebruiker) {
       this.gebruiker = gebruiker;
   }

   /**
    * Functie die nagaat welke de geselecteerde gebruiker is.
    * @return De geselecteerde gebruiker
    */
   public Gebruiker getSelectedGebruiker() {
       return selectedGebruiker;
   }

   /**
    * Functie die de status van een gebruiker op selected zet
    * @param selectedGebruiker De gebruiker die geselecteerd moet worden.
    */
   public void setSelectedGebruiker(Gebruiker selectedGebruiker) {
       this.selectedGebruiker = selectedGebruiker;
   }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnDetail;
    private javax.swing.JButton btnJoin;
    private javax.swing.JButton btnMaakGameroom;
    private javax.swing.JButton btnSettings;
    private javax.swing.JToggleButton btnSmilie;
    private javax.swing.JButton btnTopscores;
    private javax.swing.JButton btnVerzenden;
    private javax.swing.JCheckBox chkPrive;
    private client.gui.controls.GameRoomPanel gameRoomPanel1;
    private client.gui.controls.HelpLinkLabel helpLinkLabel1;
    private client.gui.controls.HelpLinkLabel helpLinkLabel2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JList lstOnlineSpelers;
    private javax.swing.JPanel pnlChatroom;
    private javax.swing.JPanel pnlStartedGames;
    private javax.swing.JTabbedPane pnlTabs;
    private javax.swing.JTextField txtBericht;
    private client.gui.controls.ColoredTextpane txtaChat;
    // End of variables declaration//GEN-END:variables
   public ScrabbleClient getScrabbleGame() {
       return scrabbleGame;
   }

   public void setScrabbleGame(ScrabbleClient scrabbleGame) {
       this.scrabbleGame = scrabbleGame;
   }

   public javax.swing.JTabbedPane getPnlTabs() {
       return pnlTabs;
   }
   public Registreer getRfrm() {
       return rfrm;
   }
   public void Closerfrm()
   {
       editFrame.dispose();

   }

   public void addSmileyToTextField(String s) {
       txtBericht.setText(txtBericht.getText()+s);
   }

   public void unToggleSmileyButton() {
       btnSmilie.setSelected(false);
   }

    public Profiel getProfielForm() {
        return profielForm;
    }

}